Shiny

Shiny is an R package that makes it easy to build interactive web apps straight from R. You can host standalone apps on a webpage or embed them in R Markdown documents or build dashboards. You can also extend your Shiny apps with CSS themes, htmlwidgets, and JavaScript actions.

Shiny is most often used with the packages “shinydashboard” or “flexdashboard” to build interactive dashboards. We will walk through how to use both shinydashboard and flexdashboard to give you options when using shiny.

Shiny dashboard structure (UI - user interface)

3 Main parts:

  • Header - dashboardHeader()
  • Sidebar - dashboardSidebar()
  • Body - dashboardBody()

How to build a Sidebar Dashboard

library(shinydashboard)

sidebar <- dashboardSidebar(
  sidebarMenu(
    menuItem("Data",
      tabName = "data") #Used for linking in the body
  )
)

You can also have users input information - Different input functions: * selectInput() # Allows user to select a singular item from a list * textInput() # Allows user to input text * dateInput() # Allows user to input a date * checkboxInput() # Allows user to select multiple items

How to build user input with shinydashboard

library("shiny")
library("tidyverse")
selectInput(
  inputId = "object", # This is the name you described the object elsewhere in the application
  label = "Favorite Character", # The label you want to show to the user
  choices = c(starwars$name) # List the choices the user has to pick from
 )

Render Functions

Functions that you use in your application’s server side code, assigning them to outputs that appear in your user interface.

  • renderPrint()
  • renderText()
  • renderPlot()
  • renderUI() # HTML or a shiny tag object

Example Using Star Wars df

library(shiny)
library(tidyverse)
library(shinydashboard)

sidebar <- dashboardSidebar(
  selectInput(
    inputId = "name",
    label = "Favorite Character",
    choices = c(starwars$name)
  )
)

body <- dashboardBody(
  textOutput("name")
)

ui <- dashboardPage(header = dashboardHeader(),
                    sidebar = sidebar,
                    body = body
                    )

server <- function(input, output) {
  output$name <- renderText({
      input$name
    })
}

shinyApp(ui, server)

Flexdashboard

Flexdashboard is a similar dashboard system as shiny. A flexdashboard is filled with charts. To create a flexdashboard, you will first need to adjust the YAML header.

title: “title of document” output: flexdashboard::flex_dashboard

Now your Rmarkdown file will be interpreted as a flexdashboard file.

The flexdashboard default layout is in columns. To separate the columns, you will use the following syntax:

library(flexdashboard)

Column

Chart A

Column

Chart B

Chart C

LS0tDQp0aXRsZTogIlNoaW55IFdhbGt0aHJvdWdoIg0Kb3V0cHV0OiBodG1sX25vdGVib29rDQotLS0NCg0KIyBTaGlueQ0KDQpTaGlueSBpcyBhbiBSIHBhY2thZ2UgdGhhdCBtYWtlcyBpdCBlYXN5IHRvIGJ1aWxkIGludGVyYWN0aXZlIHdlYiBhcHBzIHN0cmFpZ2h0IGZyb20gUi4gWW91IGNhbiBob3N0IHN0YW5kYWxvbmUgYXBwcyBvbiBhIHdlYnBhZ2Ugb3IgZW1iZWQgdGhlbSBpbiBSIE1hcmtkb3duIGRvY3VtZW50cyBvciBidWlsZCBkYXNoYm9hcmRzLiBZb3UgY2FuIGFsc28gZXh0ZW5kIHlvdXIgU2hpbnkgYXBwcyB3aXRoIENTUyB0aGVtZXMsIGh0bWx3aWRnZXRzLCBhbmQgSmF2YVNjcmlwdCBhY3Rpb25zLg0KDQpTaGlueSBpcyBtb3N0IG9mdGVuIHVzZWQgd2l0aCB0aGUgcGFja2FnZXMgInNoaW55ZGFzaGJvYXJkIiBvciAiZmxleGRhc2hib2FyZCIgdG8gYnVpbGQgaW50ZXJhY3RpdmUgZGFzaGJvYXJkcy4gV2Ugd2lsbCB3YWxrIHRocm91Z2ggaG93IHRvIHVzZSBib3RoIHNoaW55ZGFzaGJvYXJkIGFuZCBmbGV4ZGFzaGJvYXJkIHRvIGdpdmUgeW91IG9wdGlvbnMgd2hlbiB1c2luZyBzaGlueS4NCg0KDQojIyBTaGlueSBkYXNoYm9hcmQgc3RydWN0dXJlIChVSSAtIHVzZXIgaW50ZXJmYWNlKQ0KDQozIE1haW4gcGFydHM6DQoNCiogSGVhZGVyIC0gZGFzaGJvYXJkSGVhZGVyKCkNCiogU2lkZWJhciAtIGRhc2hib2FyZFNpZGViYXIoKQ0KKiBCb2R5IC0gZGFzaGJvYXJkQm9keSgpDQoNCg0KIyMjIEhvdyB0byBidWlsZCBhIFNpZGViYXIgRGFzaGJvYXJkDQoNCmBgYHtyfQ0KbGlicmFyeShzaGlueWRhc2hib2FyZCkNCg0Kc2lkZWJhciA8LSBkYXNoYm9hcmRTaWRlYmFyKA0KICBzaWRlYmFyTWVudSgNCiAgICBtZW51SXRlbSgiRGF0YSIsDQogICAgICB0YWJOYW1lID0gImRhdGEiKSAjVXNlZCBmb3IgbGlua2luZyBpbiB0aGUgYm9keQ0KICApDQopDQpgYGANCg0KDQpZb3UgY2FuIGFsc28gaGF2ZSB1c2VycyBpbnB1dCBpbmZvcm1hdGlvbiAtIA0KRGlmZmVyZW50IGlucHV0IGZ1bmN0aW9uczoNCiogc2VsZWN0SW5wdXQoKSAjIEFsbG93cyB1c2VyIHRvIHNlbGVjdCBhIHNpbmd1bGFyIGl0ZW0gZnJvbSBhIGxpc3QNCiogdGV4dElucHV0KCkgIyBBbGxvd3MgdXNlciB0byBpbnB1dCB0ZXh0DQoqIGRhdGVJbnB1dCgpICMgQWxsb3dzIHVzZXIgdG8gaW5wdXQgYSBkYXRlDQoqIGNoZWNrYm94SW5wdXQoKSAjIEFsbG93cyB1c2VyIHRvIHNlbGVjdCBtdWx0aXBsZSBpdGVtcw0KDQoNCiMjIyBIb3cgdG8gYnVpbGQgdXNlciBpbnB1dCB3aXRoIHNoaW55ZGFzaGJvYXJkDQoNCmBgYHtyfQ0KbGlicmFyeSgic2hpbnkiKQ0KbGlicmFyeSgidGlkeXZlcnNlIikNCnNlbGVjdElucHV0KA0KICBpbnB1dElkID0gIm9iamVjdCIsICMgVGhpcyBpcyB0aGUgbmFtZSB5b3UgZGVzY3JpYmVkIHRoZSBvYmplY3QgZWxzZXdoZXJlIGluIHRoZSBhcHBsaWNhdGlvbg0KICBsYWJlbCA9ICJGYXZvcml0ZSBDaGFyYWN0ZXIiLCAjIFRoZSBsYWJlbCB5b3Ugd2FudCB0byBzaG93IHRvIHRoZSB1c2VyDQogIGNob2ljZXMgPSBjKHN0YXJ3YXJzJG5hbWUpICMgTGlzdCB0aGUgY2hvaWNlcyB0aGUgdXNlciBoYXMgdG8gcGljayBmcm9tDQogKQ0KYGBgDQoNCg0KIyMjIFJlbmRlciBGdW5jdGlvbnMgDQpGdW5jdGlvbnMgdGhhdCB5b3UgdXNlIGluIHlvdXIgYXBwbGljYXRpb24ncyBzZXJ2ZXIgc2lkZSBjb2RlLCBhc3NpZ25pbmcgdGhlbSB0byBvdXRwdXRzIHRoYXQgYXBwZWFyIGluIHlvdXIgdXNlciBpbnRlcmZhY2UuDQoNCiogcmVuZGVyUHJpbnQoKQ0KKiByZW5kZXJUZXh0KCkNCiogcmVuZGVyUGxvdCgpDQoqIHJlbmRlclVJKCkgIyBIVE1MIG9yIGEgc2hpbnkgdGFnIG9iamVjdA0KDQojIyBFeGFtcGxlIFVzaW5nIFN0YXIgV2FycyBkZg0KYGBge3J9DQpsaWJyYXJ5KHNoaW55KQ0KbGlicmFyeSh0aWR5dmVyc2UpDQpsaWJyYXJ5KHNoaW55ZGFzaGJvYXJkKQ0KDQpzaWRlYmFyIDwtIGRhc2hib2FyZFNpZGViYXIoDQogIHNlbGVjdElucHV0KA0KICAgIGlucHV0SWQgPSAibmFtZSIsDQogICAgbGFiZWwgPSAiRmF2b3JpdGUgQ2hhcmFjdGVyIiwNCiAgICBjaG9pY2VzID0gYyhzdGFyd2FycyRuYW1lKQ0KICApDQopDQoNCmJvZHkgPC0gZGFzaGJvYXJkQm9keSgNCiAgdGV4dE91dHB1dCgibmFtZSIpDQopDQoNCnVpIDwtIGRhc2hib2FyZFBhZ2UoaGVhZGVyID0gZGFzaGJvYXJkSGVhZGVyKCksDQogICAgICAgICAgICAgICAgICAgIHNpZGViYXIgPSBzaWRlYmFyLA0KICAgICAgICAgICAgICAgICAgICBib2R5ID0gYm9keQ0KICAgICAgICAgICAgICAgICAgICApDQoNCnNlcnZlciA8LSBmdW5jdGlvbihpbnB1dCwgb3V0cHV0KSB7DQogIG91dHB1dCRuYW1lIDwtIHJlbmRlclRleHQoew0KICAgICAgaW5wdXQkbmFtZQ0KICAgIH0pDQp9DQoNCnNoaW55QXBwKHVpLCBzZXJ2ZXIpDQoNCmBgYA0KDQoNCiMgRmxleGRhc2hib2FyZA0KDQpGbGV4ZGFzaGJvYXJkIGlzIGEgc2ltaWxhciBkYXNoYm9hcmQgc3lzdGVtIGFzIHNoaW55LiBBIGZsZXhkYXNoYm9hcmQgaXMgZmlsbGVkIHdpdGggY2hhcnRzLiBUbyBjcmVhdGUgYSBmbGV4ZGFzaGJvYXJkLCB5b3Ugd2lsbCBmaXJzdCBuZWVkIHRvIGFkanVzdCB0aGUgWUFNTCBoZWFkZXIuDQoNCnRpdGxlOiAidGl0bGUgb2YgZG9jdW1lbnQiDQpvdXRwdXQ6IA0KICBmbGV4ZGFzaGJvYXJkOjpmbGV4X2Rhc2hib2FyZA0KICANCk5vdyB5b3VyIFJtYXJrZG93biBmaWxlIHdpbGwgYmUgaW50ZXJwcmV0ZWQgYXMgYSBmbGV4ZGFzaGJvYXJkIGZpbGUuDQoNClRoZSBmbGV4ZGFzaGJvYXJkIGRlZmF1bHQgbGF5b3V0IGlzIGluIGNvbHVtbnMuIFRvIHNlcGFyYXRlIHRoZSBjb2x1bW5zLCB5b3Ugd2lsbCB1c2UgdGhlIGZvbGxvd2luZyBzeW50YXg6DQoNCmBgYHtyfQ0KbGlicmFyeShmbGV4ZGFzaGJvYXJkKQ0KYGBgDQoNCkNvbHVtbg0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KIyMgQ2hhcnQgQQ0KYGBge3J9DQoNCmBgYA0KDQpDb2x1bW4NCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQojIyBDaGFydCBCDQpgYGB7cn0NCg0KYGBgDQoNCiMjIENoYXJ0IEMNCmBgYHtyfQ0KDQpgYGANCg0KDQoNCg0KDQoNCg==